﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using WinFormPanificadora.ServicoVenda;
using WinFormPanificadora.ServicoAcessarSistema;
using WinFormPanificadora.ServicoProduto;
using System.ServiceModel;
using System.Collections;

namespace WinFormPanificadora
{
    public partial class frmPrincipal : Form
    {
        Venda venda;
        IList<ItemVenda> listaItemVenda;
        ProdutoSClient servico;

        private int idUsuario;
        public int IdUsuario
        {
            get
            {
                return idUsuario;
            }
            set
            {
                idUsuario = value;
                AtualizaLogin();
            }
        }

        private string nomeUsuario;

        public frmPrincipal()
        {
            InitializeComponent();
            venda = new Venda();
            listaItemVenda = new List<ItemVenda>();
            servico = new ProdutoSClient();
        }


        private void txtValorDinheiroVenda_Leave(object sender, EventArgs e)
        {
            Double valorDinheiro = 0;
            if (Double.TryParse(txtValorDinheiroVenda.Text, out valorDinheiro))
            {
                txtValorDinheiroVenda.Text = valorDinheiro.ToString("C");
                venda.ValorEmDinheiro = valorDinheiro;
                if (Convert.ToInt32(txtQtdeItensVenda.Text) != 0)
                {
                    if (venda.ValorEmDinheiro < venda.ValorTotalVenda)
                    {
                        MensagemErro("Valor informado menor que o valor da compra");
                    }
                    else
                    {
                        venda.ValorTroco = venda.ValorEmDinheiro - venda.ValorTotalVenda;
                        txtValorTrocoVenda.Text = venda.ValorTroco.ToString("C");
                    }
                }
            }
            else if (txtValorDinheiroVenda.Text.StartsWith("R") && Double.TryParse(txtValorDinheiroVenda.Text.Substring(3), out valorDinheiro))
            {
                txtValorDinheiroVenda.Text = valorDinheiro.ToString("C");
                venda.ValorEmDinheiro = valorDinheiro;
                if (Convert.ToInt32(txtQtdeItensVenda.Text) != 0)
                {
                    if (venda.ValorEmDinheiro < venda.ValorTotalVenda)
                    {
                        MensagemErro("Valor informado menor que o valor da compra");
                    }
                    else
                    {
                        venda.ValorTroco = venda.ValorEmDinheiro - venda.ValorTotalVenda;
                        txtValorTrocoVenda.Text = venda.ValorTroco.ToString("C");
                    }
                }
            }
            else
            {
                MensagemErro("Valor informado inválido");
                txtValorDinheiroVenda.Text = "R$ 0,00";
            }
        }

        #region Mensagens
        private void MensagemErro(string msg)
        {
            MessageBox.Show(msg, "Erro!");
        }

        private void MensagemAtencao(string msg)
        {
            MessageBox.Show(msg, "Atenção!");
        }

        private void MensagemSucesso(string msg)
        {
            MessageBox.Show(msg, "Sucesso!");
        }

        private bool MensagemPerguntaYesNo(string msg)
        {
            if (MessageBox.Show(msg, "Atenção", MessageBoxButtons.YesNo) == DialogResult.Yes)
                return true;
            else
                return false;
        }
        #endregion


        private void txtCodProduto_Leave(object sender, EventArgs e)
        {
            if (txtCodProduto.Text != null && !txtCodProduto.Text.Equals("") && txtQtdeProduto.Text != null && !txtQtdeProduto.Text.Equals("") && !txtQtdeProduto.Text.Equals("0"))
            {
                Double codProduto = new Double();
                if (Double.TryParse(txtCodProduto.Text, out codProduto) && Convert.ToDouble(txtCodProduto.Text) != 0)
                {
                    ServicoProduto.Produto produto = new ServicoProduto.Produto();
                    try
                    {
                        produto = servico.PerquisarPorCodigo(codProduto);
                        if (produto != null)
                        {
                            ServicoVenda.Produto produtoVenda = new ServicoVenda.Produto()
                            {
                                Id = produto.Id,
                                NomeProduto = produto.NomeProduto,
                                CodigoBarra = produto.CodigoBarra,
                                Descricao = produto.Descricao,
                                ValorUnitario = produto.ValorUnitario,
                                Producao = produto.Producao
                            };

                            listaItemVenda.Add(new ItemVenda()
                            {
                                IdProduto = produto.Id,
                                Produto = produtoVenda,
                                Qtde = Convert.ToDecimal(txtQtdeProduto.Text),
                                Sequencia = listaItemVenda.Count,
                                Valor = produto.ValorUnitario,
                                ValorTotal = produto.ValorUnitario * Convert.ToDouble(txtQtdeProduto.Text)
                            });
                            AtualizaGrid();
                            AtualizaCamposTotais();
                        }
                        else
                        {
                            MensagemAtencao("Produto não cadastrado");
                        }
                    }
                    catch (CommunicationException ex)
                    {
                        MensagemErro("Erro de conexão com o banco de dados");
                    }
                    catch (Exception ex)
                    {
                        MensagemErro(ex.Message.ToString());
                    }
                    txtCodProduto.Text = null;
                }
            }
        }

        private void AtualizaGrid()
        {
            dgvListaItemVenda.DataSource = listaItemVenda.ToList();
            dgvListaItemVenda.Refresh();            
        }

        private void AtualizaCamposTotais()
        {
            double valorTotal = 0;
            int qtdeItens = 0;
            foreach (ItemVenda item in listaItemVenda)
            {
                valorTotal += item.ValorTotal;
                qtdeItens ++;
            }
            venda.ValorTotalVenda = valorTotal;
            txtValorTotalVenda.Text = valorTotal.ToString("C");
            venda.QtdeItens = qtdeItens;
            txtQtdeItensVenda.Text = qtdeItens.ToString();
            if (venda.ValorEmDinheiro > venda.ValorTotalVenda)
            {
                venda.ValorTroco = venda.ValorEmDinheiro - venda.ValorTotalVenda;
                txtValorTrocoVenda.Text = venda.ValorTroco.ToString("C");
            }
            else
            {
                venda.ValorTroco = 0;
                txtValorTrocoVenda.Text = "R$ 0,00";
            }

        }

        private void AtualizaLogin()
        {
            if (idUsuario != 0)
            {
                try
                {
                    AcessarSistemaSClient servicoAcessaSistema = new AcessarSistemaSClient();
                    nomeUsuario = servicoAcessaSistema.NomeUsuario(idUsuario);
                    if (nomeUsuario != null && !nomeUsuario.Equals(""))
                    {
                        lblBemVindo.Text = "Bem vindo: " + nomeUsuario;
                    }
                }
                catch (CommunicationException ex)
                {
                    MensagemErro("Erro de conexão com o banco de dados");
                }
                catch (Exception ex)
                {
                    MensagemErro(ex.Message.ToString());
                }
            }
        }

        private void btnFinalizar_Click(object sender, EventArgs e)
        {
            if (listaItemVenda.Count != 0)
            {
                string msg = "";
                try
                {
                    venda = new Venda();
                    venda.Id = Convert.ToInt32(txtCodProduto.Text);
                    venda.QtdeItens = listaItemVenda.Count;
                    venda.IdUsuario = idUsuario;
                    venda.ValorEmDinheiro = Convert.ToDouble(txtValorDinheiroVenda.Text);
                    venda.ValorTotalVenda = Convert.ToDouble(txtValorTotalVenda.Text);
                    venda.ValorTroco = Convert.ToDouble(txtValorTrocoVenda.Text);
                    venda.DataVenda = DateTime.Now;
                    venda.FechamentoVenda = false;

                    VendaSClient servicoVenda = new VendaSClient();
                    msg = servicoVenda.Salvar(venda, ListToArray(listaItemVenda));
                    lblUltimaVenda.Text = venda.Id.ToString();
                    LimparCampos();
                }
                catch (Exception ex)
                {
                    msg = "Erro: " + ex.Message.ToString();
                }
                finally
                {
                    MensagemSucesso(msg);
                }
                    
            }
        }
        
        private void btnCancelar_Click(object sender, EventArgs e)
        {
            if (listaItemVenda.Count == 0 || MensagemPerguntaYesNo("Deseja cancelar a venda?"))
            {
                LimparCampos();
            }
        }

        private ItemVenda[] ListToArray(IList<ItemVenda> lista)
        {
            ItemVenda[] array = new ItemVenda[lista.Count];
            for (int x = 0; x <= lista.Count; x++)
            {
                array[x] = lista[x];
            }
            return array;
        }

        private void LimparCampos()
        {
            listaItemVenda = new List<ItemVenda>();
            AtualizaGrid();
            txtCodProduto.Text = null;
            txtQtdeItensVenda.Text = "0";
            txtQtdeProduto.Value = 1;
            txtValorDinheiroVenda.Text = "R$ 0,00";
            txtValorTotalVenda.Text = "R$ 0,00";
            txtValorTrocoVenda.Text = "R$ 0,00";
        }

        private void btnFechar_Click(object sender, EventArgs e)
        {
            if (MensagemPerguntaYesNo("Deseja fechar o sistema?"))
                this.Close();
        }        
    }
}
